﻿//================================================
//
//                       _oo0oo_
//                      o8888888o
//                      88" . "88
//                      (| -_- |)
//                      0\  =  /0
//                    ___/`---'\___
//                  .' \\|     |// '.
//                 / \\|||  :  |||// \
//                / _||||| -:- |||||- \
//               |   | \\\  -  /// |   |
//               | \_|  ''\---/''  |_/ |
//               \  .-\__  '-'  ___/-. /
//             ___'. .'  /--.--\  `. .'___
//          ."" '<  `.___\_<|>_/___.' >' "".
//         | | :  `- \`.;`\ _ /`;.`/ - ` : | |
//         \  \ `_.   \_ __\ /__ _/   .-` /  /
//     =====`-.____`.___ \_____/___.-`___.-'=====
//                       `=---='
//
//
//     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
//               佛祖保佑         永无BUG
//
//
//
//================================================
//
// Created by Huiyi on 2021/4/20.
//
//@模块名称 易炫彩线程库
//@依赖   module_base.h
//@依赖   module_windowsApi.h
//@版本   1.3
//@日期   2022-10-05
//@作者   Huiyi
//@模块备注 封装线程功能
//项目gitee地址 https://gitee.com/LoveA/XL_XExpand
//大部分代码已经历过粗略测试
//如发现BUG可提交issues
//https://gitee.com/LoveA/XL_XExpand/issues
//反馈QQ群:594165459

#pragma once

#ifndef XL_XEXPAND_THREAD_H
//@隐藏{
#define XL_XEXPAND_THREAD_H    //防止复用

#if XC_MOUDLE
#include "module_base.h"
#endif
//@隐藏}

//@src  "thread.cpp"


// TODO: 线程操作
//@分组{  线程操作

//@别名   线程许可证
#define CRITICALSECTION CRITICAL_SECTION

//@别名   线程_创建线程(传入的子程序,传入的参数,线程ID)
HANDLE X_Thread_CreateThread (LPVOID lpStartAddress,DWORD lpParameter, UINT& lpThreadId);

//@别名   线程_关闭句柄(线程句柄)
bool X_Thread_CloseHandle(HANDLE handle);

//@别名   线程_打开(线程ID)
HANDLE X_Thread_OpenThread(int ThreadId);

//@备注   GetCurrentThreadId,获取当前线程一个唯一的线程标识符
//@别名   线程_取自线程ID()
int X_Thread_GetCurrentThreadId();

//@备注   GetCurrentThread,获取当前线程的一个伪句柄
//@别名   线程_取自线程句柄()
HANDLE X_Thread_GetCurrentThread();

//@备注   有时执行线程的时候，会自动关闭，此时，可以在多线程的程序里创建COM对象前先初始化，一个线程只能调用一次
//@别名   线程_初始化COM库()
void X_Thread_COMINIT();

//@备注   取消COM库的初始化，如果你在线程头部加入了 线程_初始化COM库 请在尾部加入此命令
//@别名   线程_取消COM库()
void X_Thread_COMUNINIT();

//@备注   成功返回指定窗口的线程ID
//@别名   线程_取ID()
int X_Thread_GetID(HWND hwnd);

//@备注   强制终止正在运行的线程,成功返回真,失败返回假.
//@别名   线程_销毁()
bool X_Thread_Destroy (HANDLE handle);

//@备注   创建并返回一个进入许可证数值，此许可证值用作进入程序中的指定许可代码区，以避免多线程冲突
//@别名   线程_创建进入许可证()
CRITICALSECTION X_Thread_CriticalSection ();

//@备注   删除由"创建进入许可证"命令所创建返回的进入许可证(该命令会在本类被销毁时自动被调用)
//@别名   线程_删除许可证()
void X_Thread_DelSection (CRITICALSECTION &SECTION);

//@备注   根据已经创建的许可证进入指定许可代码区，在此线程未退出之前，其它线程如要通过同一个进入许可证进入该许可代码区则必须先等待此线程退出许可代码区，从而保证了指定许可代码区在任何时候都只能有一条线程进入并执行
//@别名   线程_进入许可区()
void X_Thread_EnterCriticalSection(CRITICALSECTION &SECTION);

//@备注   指示当前线程将退出许可代码区，并允许其它使用同一进入许可证的线程进入此许可代码区
//@别名   线程_退出许可区()
void X_Thread_LeaveCriticalSection(CRITICALSECTION &SECTION);


//@分组}  线程操作

//@隐藏{
#ifndef XL_XEXPAND_XCLPTR
#define XL_XEXPAND_XCLPTR 
#ifdef _WIN64
typedef __int64 XCLPTR;
#else
typedef int XCLPTR;
#endif
#endif
//@隐藏}

#endif //XL_XEXPAND_THREAD_H
